import { FangPars, defaultConfig as defaultConfigOut } from './index';
import type { Config as ConfigOut } from './index';
import type { ConfigCallback } from '../com';

export interface Config extends ConfigOut {
	/**
	 * 提出单位
	 */
	unit?: string;

	/**
	 * 获取文件地址前缀
	 */
	getGeneUrl?: (name: string, url: string, _wj?: string) => string;
	/**
	 * 处理函数
	 */
	setScss?: (
		//文件名称
		name: string,
		//文件目录
		url: string,
		//文件内容
		text: string,
	) => string;
}

const defaultConfig: Config = Object.assign({}, defaultConfigOut, {
	name: 'scss',
	outDir: './dist/',
	/**
	 * 文件后缀
	 */
	extensions: ['scss'],
	/**
	 * 是否覆盖以有的文件
	 */
	fileCover: false,
	/**
	 * 是否读取文件
	 */
	read: true,
	/**
	 * 获取文件地址前缀
	 */
	getGeneUrl(name: string, url: string, _wj?: string) {
		return url;
	},
	/**
	 * 处理函数
	 */
	setScss(
		//文件名称
		name: string,
		//文件目录
		url: string,
		//文件内容
		text: string,
	) {
		return text;
	},
});

/**
 * 从 SCSS 文件内容中提取所有未被注释的 @use 和 @import 引用的路径
 * @param {string} scssContent - SCSS 文件内容
 * @returns {string[]} 提取到的路径数组（已去重）
 */
function extractScssImports(scssContent: string): string[] {
	// 移除所有多行注释 (/* ... */)
	const withoutBlockComments = scssContent.replace(/\/\*[\s\S]*?\*\//g, '');

	// 按行处理，正确移除行内注释并提取导入语句
	const lines = withoutBlockComments.split('\n');
	const imports = new Set<string>();

	for (let line of lines) {
		// 改进的行内注释处理：正确处理行内注释前的非空白字符
		let cleanLine = line.replace(/((?!\/\/)*)\/\/[\s\S]*$/, '$1').trim(); // 处理行尾注释前有非空白字符的情况
		// 匹配 @use 和 @import 语句
		const useMatch = cleanLine.match(/@use\s+['"]([^'"]+)['"]/);
		const importMatch = cleanLine.match(/@import\s+['"]([^'"]+)['"]/);

		if (useMatch) imports.add(useMatch[1]);
		if (importMatch) imports.add(importMatch[1]);
	}

	return Array.from(imports);
}

export class FangScss extends FangPars {
	constructor(config?: Config, callback?: ConfigCallback) {
		super();
		this.config = {};
		this._configCallback = callback;
		this._defaultConfig = defaultConfig;
		this.initConfig(config || this.config);
	}
	getImps(text: string) {
		return extractScssImports(text);
	}
}

export async function runDev(
	config?: Config,
	configCallback?: ConfigCallback,
	callback?: (fang: FangScss) => void,
) {
	const fang = new FangScss(config);
	await fang.runDev(() => {}, configCallback);
	if (callback) {
		callback(fang);
	}
}
